#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <assert.h>
#include <errno.h>
using namespace std;

/**
 * 管道：管道是针对本地两个进程之间通信而设计的通信方法，管道建立撞击后，实际获得两个文件描述符
 * 一个用于读取而另一个用于写入
 * 
 * 常见的ipc机制：通过pipe系统调用
 * 
 * 管道是单工对阿，数据只有一个方向流动，需要双向通信时，需要建立两个管道
 * 
 * 管道分类和读写
 *      匿名管道父子进程必须是有亲缘关系，或者兄弟之间
 *      pipe系统调用，管道由父进程建立
 *      管道位于内核空间，其实是一块缓存
 *      
 *命名管道（FIFO）
        两个没有任何关系的进程之间的通信课通过命名管道进行数据传输，本质是内核的一块缓存，另在系统中以一个特殊的文件存在
        通过系统调用mkfifo创建
 *  
 *  #incldue<unistd.h>
 *  int pipe(int fd[2];)
 *  返回成功返回0，失败返回-1
 * 
 * fd[0]表示读取管道，fd[1]表示写入管道
 * 
*/

//开启文件描述符，一定要注意关闭

int main(){
    int ret=0;

    int fds[2];
    ret=pipe(fds);
    //assert(ret>0);

    pid_t pid=fork();
    
    if(pid<0){
        perror("fork");
        exit(1);
    }else if(pid==0){
        sleep(3);
        //子进程读
        close(fds[1]);
        char buf[16]="";
        int n=read(fds[0],buf,sizeof(buf));
        if(n<0){

            std::cout<<"阅读失败"<<std::endl;
            exit(1);
        }

        std::cout<<buf<<std::endl;
        close(fds[0]);


    }else{
        char buf[16]="hello world";
        //父进程写
        close(fds[0]);
        write(fds[1],buf,sizeof(buf));
        close(fds[1]);
    }
    

    return 0;
}

